//
// Created by WINDOWS on 2024/12/31.
//

#ifndef CALCULATOR_CALCULATOR_H
#define CALCULATOR_CALCULATOR_H

#include <iostream>
#include <string>
#include <cmath>
//#include <cctype>
//#include <stdexcept>
//#include <stack>
//#include <map>
using namespace std;
// 功能说明：
// c++ 编写代码实现计算器功能，支持运算符：+, - , *, /, %（百分号）, ^（幂次方）, | |（绝对值），！（阶乘）。其他符号：( ) [ ] { }。
// 使用递归下降解析的方法来解析表达式。

enum class CalculatorError {
    None,
    UnexpectedEndOfExpression,
    MismatchedBrackets,
    DivisionByZero,
    UnexpectedCharacter,
    FactorialError
};

struct ErrorInfo {
    CalculatorError errorType;
    std::string message;
};

class Calculator {
public:
    double evaluate(const std::string& expression);
    ErrorInfo getErrorInfo() const { return errorInfo; }
private:
    double parseExpression(void);
    double parseTerm(void);
    double parseFactor(void);
    double parseUnary(void);
    double parsePrimary(void);
    double factorial(double n);
    bool matchingBracket(char opening, char closing);

    std::string expression;
    size_t pos{0};
    ErrorInfo errorInfo; // 用于存储错误信息
};
#endif //CALCULATOR_CALCULATOR_H
